package br.com.cogerh.sidec.view;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import org.primefaces.model.DualListModel;

import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;

import br.com.cogerh.sidec.model.Diretoria;
import br.com.cogerh.sidec.model.Gerencia;
import br.com.cogerh.sidec.model.Pessoa;

@ManagedBean(name = "gerenciaBean")
@SessionScoped
public class GerenciaBean {

	private Gerencia gerencia;
	private List<Gerencia> listaGerencia;
	private List<SelectItem> listaGerencia2; //Select usado no filtro de busca
	private List<SelectItem> listaNomeResponsavel;
	private List<SelectItem> listaNomeDiretoria;
	private List<String> pessoasDisponiveis = new ArrayList<String>();
	private List<String> pessoasSelecionadas = new ArrayList<String>();
	private DualListModel<String> dualListModelPessoa;
	private Integer idGerenciaSelecionado;
	private List<String> listaNomesGerencias;
	private String nomeGerenciaSelecionada;
	private Integer diretor;
	private Integer responsavel;
	

	
	public String novo() {
		gerencia = new Gerencia();
		gerencia.setDiretoria(new Diretoria());
		gerencia.setGerente(new Pessoa());
		populaListaNomeResponsavel();
		populaListaNomeDiretoria();
		populaPessoasDisponiveis();
		
		pessoasSelecionadas = new ArrayList<String>();
		dualListModelPessoa = new DualListModel<String>(pessoasDisponiveis,
				pessoasSelecionadas);

		return "sucesso";
	}

	public String consultar() {
		populaGerenciaSelect();
		idGerenciaSelecionado = new Integer(0);
		listar();
		return "sucesso";
	}

	public String editar() {
		pessoasSelecionadas = new ArrayList<String>();

	
		
		populaListaNomeResponsavel();
		populaListaNomeDiretoria();
		populaPessoasDisponiveis();
		
		for (Pessoa pessoa : gerencia.getPessoas()) {
			pessoasSelecionadas.add(pessoa.getNome());
		}
		dualListModelPessoa = new DualListModel<String>(pessoasDisponiveis,pessoasSelecionadas);

		
		return "sucesso";
	}

	public String cancelar() {
		return "sucesso";
	}

	public String salvar() {
		gerencia.setPessoas(addPessoaGerencia());

		if (gerencia != null) {

			GerenciaRN gerenciaRN = new GerenciaRN();
			if (gerencia.getId() == null) {
			
				gerenciaRN.salvar(gerencia);

			} else {
				gerenciaRN.editar(gerencia);
				
				gerencia = new Gerencia();
			}
			listar();
			limparFormulario();
			return "sucesso";
		} else {
			return "erro";

		}
		
	
	}

	public List<Pessoa> addPessoaGerencia() {
		PessoaRN pessoaRN = new PessoaRN();

		List<Pessoa> listaPessoaRN = pessoaRN.listar();
		List<Pessoa> pessoasGerencia = new ArrayList<Pessoa>();

		// Varrendo todas as String com os nomes das Pessoas Selecionadas
		for (String nome_pessoa : dualListModelPessoa.getTarget()) {
			for (Pessoa pessoa : listaPessoaRN) {
				if (nome_pessoa.equals(pessoa.getNome())) {
					pessoasGerencia.add(pessoa);

				}

			}

		}

		return pessoasGerencia;

	}

	public void listar() {
		listaGerencia = new ArrayList<Gerencia>();
		GerenciaRN gerenciaRN = new GerenciaRN();

		this.listaGerencia = gerenciaRN.listar();

	}

	public void excluir() {
		GerenciaRN gerenciaRN = new GerenciaRN();

		if (gerencia != null) {
			gerenciaRN.excluir(gerencia);
			listar();
		}

	}

	public void populaListaNomeResponsavel() {
		PessoaRN pessoaRN = new PessoaRN();
		this.listaNomeResponsavel = new ArrayList<SelectItem>();
		for (Pessoa responsavel : pessoaRN.listar()) {
			this.listaNomeResponsavel.add(new SelectItem(responsavel.getId(),
					responsavel.getNome()));

		}

	}

	public String teste(Integer id){
		PessoaRN pessoaRN = new PessoaRN();
	  Pessoa p = 	  pessoaRN.listarpessoaById(id);
	  return p.getNome();

	}
	
	
	// ///////////////////////////////////////////////////////
	public void populaPessoasDisponiveis() {
		PessoaRN pessoaRN = new PessoaRN();
		pessoasDisponiveis = new ArrayList<String>();

		for (Pessoa pessoa : pessoaRN.pessoasDisponiveis()) {
			this.pessoasDisponiveis.add(pessoa.getNome());

		}
	}

	// //////////////////////////////////////////////
	public void populaListaNomeDiretoria() {
		DiretoriaRN diretoriaRN = new DiretoriaRN();
		this.listaNomeDiretoria = new ArrayList<SelectItem>();

		for (Diretoria diretoria : diretoriaRN.listar()) {
			this.listaNomeDiretoria.add(new SelectItem(diretoria.getId(),
					diretoria.getNome()));
		}
	}	
	
	
/*	private void populaGerenciaSelect() {
		GerenciaRN gerenciaRN = new GerenciaRN();
		this.listaGerencia2 = new ArrayList<SelectItem>();
		
		for (Gerencia gerencia : gerenciaRN.listar()) {
			this.listaGerencia2.add(new SelectItem(gerencia.getId(), gerencia.getNome()));
		}

	}
	
	
*/	
	//pega os nomes de todas as gerencia e coloca na lista "listaNomesGerencias"
	private void populaGerenciaSelect() {
		GerenciaRN gerenciaRN = new GerenciaRN();		
		listaNomesGerencias = new ArrayList<String>();
		
		for (Gerencia gerencia : gerenciaRN.listar()) {
			listaNomesGerencias.add(gerencia.getNome());
		}
		
	}
	
	public List<String> complete(String query) {
		populaGerenciaSelect();
		List<String> listaCompleteGerencias = new ArrayList<String>();
		
		for (String gerencia : listaNomesGerencias) {
			if(gerencia.toLowerCase().contains(query.toLowerCase())){
				listaCompleteGerencias.add(gerencia);
			}
			
		}
		
		return listaCompleteGerencias;
	}
	
	public List<Diretoria> completeDiretoria(String query){
		DiretoriaRN diretoriaRN = new DiretoriaRN();
		List<Diretoria> listaDiretorias = new ArrayList<Diretoria>();
		
		for (Diretoria diretoria : diretoriaRN.listar()) {
			if(diretoria.getNome().toLowerCase().contains(query.toLowerCase())){
				listaDiretorias.add(diretoria);
			}
		}
		
		return listaDiretorias;
		
	}
	
	public List<Pessoa> completeResponsavel(String query){
		PessoaRN pessoaRN = new PessoaRN();
		List<Pessoa> listaPessoas = new ArrayList<Pessoa>();
		
		for (Pessoa pessoa : pessoaRN.listar()) {
			if(pessoa.getNome().toLowerCase().contains(query.toLowerCase())){
				listaPessoas.add(pessoa);
			}
		}
		
		return listaPessoas;
		
	}
	
	public void listarByFiltros() throws ParseException{
		GerenciaRN gerenciaRN = new GerenciaRN();		
		listaGerencia = gerenciaRN.listarByParametros(nomeGerenciaSelecionada);
		nomeGerenciaSelecionada = "";
		
	}


	public void limparFormulario() {
		this.gerencia = null;
	
	}

	public Gerencia getGerencia() {
		return gerencia;
	}

	public void setGerencia(Gerencia gerencia) {
		this.gerencia = gerencia;
	}

	public List<Gerencia> getListaGerencia() {
		return listaGerencia;
	}

	public void setListaGerencia(List<Gerencia> listaGerencia) {
		this.listaGerencia = listaGerencia;
	}

	public List<SelectItem> getListaNomeResponsavel() {
		return listaNomeResponsavel;
	}

	public void setListaNomeResponsavel(List<SelectItem> listaNomeResponsavel) {
		this.listaNomeResponsavel = listaNomeResponsavel;
	}

	public List<SelectItem> getListaNomeDiretoria() {
		return listaNomeDiretoria;
	}

	public void setListaNomeDiretoria(List<SelectItem> listaNomeDiretoria) {
		this.listaNomeDiretoria = listaNomeDiretoria;
	}

	public GerenciaBean() {

	}

	public DualListModel<String> getDualListModelPessoa() {
		return dualListModelPessoa;
	}

	public void setDualListModelPessoa(DualListModel<String> dualListModelPessoa) {
		this.dualListModelPessoa = dualListModelPessoa;
	}

	public List<String> getPessoasDisponiveis() {
		return pessoasDisponiveis;
	}

	public void setPessoasDisponiveis(List<String> pessoasDisponiveis) {
		this.pessoasDisponiveis = pessoasDisponiveis;
	}

	public List<String> getPessoasSelecionadas() {
		return pessoasSelecionadas;
	}

	public void setPessoasSelecionadas(List<String> pessoasSelecionadas) {
		this.pessoasSelecionadas = pessoasSelecionadas;
	}
	
	public List<SelectItem> getListaGerencia2() {
		return listaGerencia2;
	}

	public void setListaGerencia2(List<SelectItem> listaGerencia2) {
		this.listaGerencia2 = listaGerencia2;
	}

	public Integer getIdGerenciaSelecionado() {
		return idGerenciaSelecionado;
	}

	public void setIdGerenciaSelecionado(Integer idGerenciaSelecionado) {
		this.idGerenciaSelecionado = idGerenciaSelecionado;
	}
	
	public List<String> getListaNomesGerencias() {
		return listaNomesGerencias;
	}

	public void setListaNomesGerencias(List<String> listaNomesGerencias) {
		this.listaNomesGerencias = listaNomesGerencias;
	}

	public String getNomeGerenciaSelecionada() {
		return nomeGerenciaSelecionada;
	}

	public void setNomeGerenciaSelecionada(String nomeGerenciaSelecionada) {
		this.nomeGerenciaSelecionada = nomeGerenciaSelecionada;
	}

	public Integer getDiretor() {
		return diretor;
	}

	public void setDiretor(Integer diretor) {
		this.diretor = diretor;
	}

	public Integer getResponsavel() {
		return responsavel;
	}

	public void setResponsavel(Integer responsavel) {
		this.responsavel = responsavel;
	}
	

}
